package cn.cjxy.util;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一响应结果
 * @param <T>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class R<T> {
    //状态码
    private Integer code;//200/400/500
    //操作结果
    private Boolean success;
    //提示语
    private String msg;
    //响应数据
    private T data;
    //成功不带数据的
    public static <T> R<T> ok() {
        return new R<T>(200,true,"操作成功",null);
    }
    //成功带数据的
    public static <T> R<T> ok(T data) {
        return new R<T>(200,true,"操作成功",data);
    }
    //成功需要自定义提示信息的
    public static <T> R<T> ok(String message) {
        return new R<T>(200,true,message,null);
    }
    //成功需要自定义提示信息和数据的
    public static <T> R<T> ok(String message,T data) {
        return new R<T>(200,true,message,data);
    }


    //失败不带数据和信息的
    public static <T> R<T> fail() {
        return new R<T>(500,false,"操作失败",null);
    }
    //失败带数据
    public static <T> R<T> fail(T data) {
        return new R<T>(500,false,"操作失败",data);
    }
    //失败带自定义信息的
    public static <T> R<T> fail(String message) {
        return new R<T>(500,false,message,null);
    }
    //失败需要自定义提示信息和数据的
    public static <T> R<T> fail(String message,T data) {
        return new R<T>(500,false,message,data);
    }


    //失败需要自定义状态码的
    public static <T> R<T> fail(Integer code, T data) {
        return new R<T>(code, false, "操作失败！", data);
    }
    //失败需要自定义状态码和信息的
    public static <T> R<T> fail(Integer code, String message) {
        return new R<T>(code, false, message, null);
    }
    //失败需要自定义状态码和信息和数据的
    public static <T> R<T> fail(Integer code, String message, T data) {
        return new R<T>(code, false, message, data);
    }
}
